import axios from '../utils/request';
import type {SaleData, SaleQuery} from "../model/sale.ts";
import {post} from "./requests.ts";

// import {AxiosResponse} from "axios";

/**
 * 左连接配置类型
 * @property table_name - 关联表名（必填）
 * @property alias - 关联表别名（可选）
 * @property on - 关联条件（如 "u.id = o.user_id"，必填）
 */
export interface LeftJoinParams {
    table_name: string;
    alias?: string;
    on: string;
}

export interface LikesParams {
    field: string;
    value: string;
    mode: 'prefix' | 'suffix' | 'full';
}

/**
 * 联合查询配置类型
 * @property table_name - 子查询表名（必填）
 * @property fields - 子查询字段（可选，默认 "*"）
 * @property where - 子查询条件（可选）
 */
export interface UnionQueryParams {
    table_name: string;
    fields?: string;
    where?: string;
}

/** IN 筛选条件（处理多选组件的数组值） */
export interface InFilter {
    field: string; // 字段名（如 "status"、"category_id"）
    values: (string | number)[]; // 多选的值（数组）
}

export interface RangeFilter {
    /** 字段名（如 "create_time"、"amount"） */
    field: string;
    /** 操作符（支持 >、<、>=、<=） */
    operator: '>' | '<' | '>=' | '<=';
    /** 比较值（日期字符串、数字等，如 "2025-11-07" 或 "100"） */
    value: string | number; // 支持字符串或数字类型输入
}

export interface QueryCondition {
    /** 字段名（如 "create_time"、"amount"） */
    field: string;
    /** 操作符（支持 >、<、>=、<=） */
    operator: '>' | '<' | '>=' | '<=' | '=' | 'IN' | 'LIKE' | 'in' | 'like';
    /** 比较值（日期字符串、数字等，如 "2025-11-07" 或 "100"） */
    value: string | number | number[] | string[]; // 支持字符串或数字类型输入
}

/**
 * 字段格式化规则类型
 * @property field - 要格式化的字段名（必填）
 * @property type - 格式化类型（如 "date" | "number"，必填）
 * @property pattern - 格式化模板（如日期布局 "2006-01-02"，必填）
 */
export interface FormatRule {
    field: string;
    type: string;
    pattern: string;
}

export interface OrderBy {
    field: string;
    orderType?: 'asc' | 'desc';
}

/**
 * 通用查询请求参数
 * @property table_name - 主表名（可选，单表查询可省略，用queryItem代替）
 * @property fields - 查询字段（可选，默认 "*"）
 * @property where - 筛选条件（可选，如 "status = 1 AND age > 18"）
 * @property left_joins - 左连接配置（可选）
 * @property unions - 联合查询配置（可选）
 * @property order_by - 排序（可选，如 "create_time DESC"）
 * @property page - 页码（可选，默认 1）
 * @property page_size - 每页条数（可选，默认 10）
 * @property format - 字段格式化规则（可选）
 */
export interface CommonQueryRequest {
    table_name?: string;
    fields?: string;
    where?: QueryCondition[];
    left_joins?: LeftJoinParams[];
    unions?: UnionQueryParams[];
    order_by?: OrderBy[];
    page?: number;
    page_size?: number;
    format?: FormatRule[];
    distinct?: boolean;
}

/**
 * 接口响应数据结构（内层data）
 * @property total - 总条数（兼容无总数场景，默认 0）
 * @property page - 当前页码（默认 1）
 * @property page_size - 每页条数（默认 10）
 * @property data - 查询结果数组（动态字段）
 */
export interface CommonQueryResponseData {
    total: number;
    page: number;
    page_size: number;
    data: any[];
}

/**
 * 最终接口响应格式
 * @property code - 状态码（200 为成功）
 * @property msg - 提示信息
 * @property query_item - 查询标识（与入参queryItem一致）
 * @property data - 核心响应数据
 */
export interface CommonQueryResult<T> {
    code: number;
    msg: string;
    query_item: string;
    data: T[];
}

/**
 * 通用查询请求函数
 * @param queryItem 路由参数（单表查询=表名，多表查询=自定义日志标识）
 * @param params 查询参数配置（可选，默认空对象）
 * @returns 接口返回的 data 数组（自动处理默认值）
 * @throws 错误对象（包含错误信息）
 */
export const commonQuery = async <T>(
    queryItem: string,
    params: CommonQueryRequest = {}
): Promise<T[]> => {
    const requestParams: CommonQueryRequest = {
        page: 1,
        page_size: 10,
        fields: '*',
        ...params,
    };

    try {
        // 明确指定响应类型为 AxiosResponse<CommonQueryResult>
        const response = await post<T[]>(
            `/query/${queryItem}`,
            requestParams
        );
        // 关键点2：返回后端数据中的 data 数组
        return response || [];
    } catch (error) {
        const errorMsg = error instanceof Error
            ? error.message
            : `查询失败（queryItem: ${queryItem}）`;
        console.error(`[commonQuery] ${errorMsg}`, error);
        return [];
    }
};


export const querySales = async (param: SaleQuery): Promise<any> => {
    const requestParams: CommonQueryRequest = {}
}